Griever's Stuff

-Документация

-Статьи

-Переводы...

 

Griever's pointer searcher

 

 

 

Для начинающих.

Если вы не знаете что такое поинтеры (они же указатели) и не знаете, зачем их менять, почитайте вполне доступную начинающим документацию на "Шедевре". Эта программа только ищет указатели на NES и ничего больше.    Итак, вы решили качественно перевести игру на NES и хотите найти поинтеры, но методы подсчёта указателей слишком утомительны и вы никогда не открывали отладчик? Тогда, в первую очередь попробуйте найти указатели в ROM'е визуально в любом хекс редакторе. Как правило, указатели организованны в виде таблиц. Со стороны это выглядит как довольно большой массив пар байт: один должен быть обязательно больше $80, а второй может быть любым. Как правило, большие байты постоянно медленно растут. Массив в большинстве случаев располагается прямо перед блоком с текстом в РОМе

Ну как, не видать? Тогда запускайте GPS.exe и... 

Надёжный способ:

1) Откройте РОМ, в котором вы хотите найти указатели. Впишите в окно слева адрес строки (в 16-ричном формате), указатель на которую вы хотите найти (адрес вы должны были узнать до этого - вы же должны знать какой текст будете переводить ;)). Нажмите "Добавить", а затем "Поиск". В нижнем окне должны появиться результаты (если нет, то попробуйте "Быстрый способ", описанный ниже). В верхнем ничего не должно быть (т.к. адреса одной строки явно недостаточно, чтобы искать по разности смещений двух строк). Ткните мышкой на любом понравившемся вам результате (почти всегда возможных указателей будет несколько), - внизу появится адрес выбранного указателя, а затем нажмите "Поменять". Прямо с открытой программой, откройте тот же РОМ в любом эмуляторе. Если выбранный вами указатель оказался искомым, то строка должна либо поменяться со следующей строкой, либо запороться (пустота или какие-нибудь "кракозябры"). Если же этого не произошло, то закрывайте эмулятор, возвращайтесь в программу, жмите на "Поменять" ещё раз (РОМ вернётся к исходному состоянию). А потом ткните на следующий возможный вариант, и так пока не кончатся результаты или не будет найден нужный указатель.

!Не забудьте каждый раз закрывать эмулятор, ну или хотя бы перезагружать РОМ после каждого изменения!

Быстрый способ

2) Быстрее всего было бы найти адрес интересующей вас строки и следующей за ней, и "Добавить" их по очереди (в порядке появления в РОМе). А затем нажать на поиск. В верхнем окне, как и в нижнем должны появиться результаты поиска. Совпадения адресов указателей отмечаются красным цветом. Если у вас есть совпадения в двух окнах, то ПОЧТИ НАВЕРНЯКА это искомый указатель. Чтобы убедиться окончательно, стоит опять "Поменять" указатели и проверить в эмуляторе (см. "Надёжный способ")Впрочем, если нужна большая точность (слишком много возможных вариантов), можно добавить и адрес третьей строки. Вообще, программа позволяет добавлять сколько угодно адресов и искать по ним.

 

Для тех, кто немного понимает:

В программе реализовано два метода поиска указателей:

1)Поиск по длине строк. В последнее время, на форумах Шедевра и MagicTeam участились случаи, когда начинающим советуют искать указатели обычным Relative Search (подробности см. на вышеупомянутых форумах). Данный метод реализует этот алгоритм. Стоит заметить, что он довольно чувствителен к расположению указателей. Нередко в некоторых играх бывает, что указатели организованы не таблицей, а просто разбросаны (например, Cliffhanger). В таком случае, метод не даст результатов. Кроме того, возможны ситуации, когда поинтеры по порядку в РОМе не указывают на соответствующие строки в порядке их появления в РОМе (если не ошибаюсь, такое было в EarthBound'e), в таком случае, этот метод также будет бесполезен. Зато, это никак не влияет на SetOff X000 (см. ниже) и нижним окошком можно смело пользоваться.

2)Поиск по SetOff X000. Метод не раз описанный в различной документации теперь здесь с небольшими оптимизациями, позволяющими, тем не менее, значительно сузить возможные варианты указателей. Любопытные могут прочитать о "теории" этой оптимизации здесь.

Как уже следовало из вышесказанного, метод довольно надёжен, но есть случаи, когда и он бессилен. Например, если старшие и младшие байты указателей раскиданы по двум разным таблицам. К слову сказать, это бывает не так уж и редко (TaleSpin, Darkwing Duck и пр.). Тогда указатели можно найти только с помощью отладки кода или, что более реально для начинающих, коруптером.

С моей стороны было сделано всё, чтобы программа отсекла как можно больше заведомо неверных вариантов. Она не ищет указатели в заголовке =), не ищет их в таблице прерываний и CHR-ROM'е, сделаны все те доработки, о которых я говорил в своём документе. Соответственно, в РОМе обязательно должен быть заголовок.

 При желании можно искать указатели и на пожатые данные, на строки, оптимизированные DTE, MTE, при большом желании на графику ^_^(разумеется, нужно смещение хотя бы первого блока данных) Словом, старый добрый SetOff X000 ещё никому не мешал.

 

FAQ

 

1)Почему при нажатии кнопки "Поменять" становятся недоступны некоторые элементы?

-Это чтобы вы любимый РОМ не запороли ^_^ Впрочем, при большом желании можно просто выйти из программы, не поменяв всё обратно.

 

2)Я всё делал, как написано в инструкции, но вариантов либо нет вообще, либо ни один из предложенных вариантов не подходит!

-Очевидно, указатели не организованы в таблицы, или старший и младшие байты раскиданы по двум таблицам, либо это нечто, о чём я не имею понятия... Ну что ж, по крайней мере, вы попробовали =). Кстати, Relative Search'ем или по SetOff X000 можно уже вручную не искать...

 

3)Почему если число заданных строк равно единице, то ищет только SetOff X000?

-Потому что результатов будет в два раза больше, чем размер PRG-ROM'а, что займет много времени, да и результат будет абсолютно бесполезен.

 

4)Почему бы не выводить только то окно, где меньше вариантов?

-Потому что самое главное - увидеть совпадения по двум вариантам поиска, а уж число вариантов указано над каждым окном.

 

5)У меня идея: можно сделать поиск по SetOff X000 первой строки + поиск по SetOff X000 второй строки, затем сравнить и если указатели идут друг за другом, то это таблица поинтеров.

-Хм-м-м... Не думаю. Это удобно, когда число строк равно двум, но:

1)Совпадение по двум методам итак даёт хорошую вероятность.

2)В алгоритме поиска по длинам строк уже учтено, что указатели стоят в таблице.

3)Это труднореализуемо.

 

To Do

Если кому будет нужно, можно добавить информацию об открытом РОМе...

 

Благодарности

Огромное спасибо Djinn'у. Если бы не его помощь, то я бы утонул в Exception Handling'ах и, скорее всего, просто бросил бы программу.

 

Напоследок

Обратите внимание на то, что программу тестил только я на очень небольшом количестве игр (собственно, поэтому это и V0.9). Так что, если вы подозреваете, что программа работает не так, как должна (у меня такого не было - всё, что она не нашла, было вполне естественно), пожалуйста, не поленитесь и свяжитесь со мной: Griever@rambler.ru